package generic;

/**
 *
 * 擦除和迁移兼容性意味着，使用泛型并不是强制的
 *
 * @author ChangLiang
 * @date 2021/2/1
 */
class GenericBase<T> {

    private T element;

    public void set(T arg) {
        arg = element;
    }

    public T get() {
        return element;
    }
}

class Derived1<T> extends GenericBase<T> {
}

/**
 * Derived2继承自GenericBase，但是没有任何泛型参数，而编译器不会发出任何警告。
 */
class Derived2 extends GenericBase {
} // No warning

/**
 * 可以推断， Derived3产生的错误意味着编译器期望得到一个原生基类。
 */
// class Derived3 extends GenericBase<?> {}
// Strange error:
//   unexpected type found : ?
//   required: class or interface without bounds

public class ErasureAndInheritance {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        Derived2 d2 = new Derived2();
        Object obj = d2.get();
        // Warning here!
        // 警告在set()被调用时才会出现。
        d2.set(obj);
    }
}
